#include"MVCgamemode.h"
#include<time.h>
#include<stdlib.h>

void Gamemodel::Startgame(Gametype type)
{
    gametype=type;

    //初始棋盘
    gameMapVec.clear();
    for(int i=0;i<BOARD_GRAD_SIZE;i++)//循环十五次
    {
        std::vector<int>lineBoard;
        for(int j=0;j<BOARD_GRAD_SIZE;j++)
            lineBoard.push_back(0);
        gameMapVec.push_back(lineBoard);
    }

    //如果是AI模式，需要初始化评分数组
   if(gametype==AI)
   {
       scoreMapVec.clear();//clear 初始化 释放内存
       for(int i=0;i<BOARD_GRAD_SIZE;i++)//棋盘上的点原始分全设为零
       {
           std::vector<int>lineScores;
           for(int j=0;j<BOARD_GRAD_SIZE;j++)
                lineScores.push_back(0);
           scoreMapVec.push_back(lineScores);
       }

   }
   //轮到黑方下棋时为true，白方为false
   playerflag=true;
}

void Gamemodel::byman(int row, int col)
{
    updateGameMap(row,col);
}

void Gamemodel::updateGameMap(int row, int col)
{
    if(playerflag)
        gameMapVec[row][col]=1;
    else
         gameMapVec[row][col]=-1;

    //换手
    playerflag=!playerflag;
}

bool Gamemodel::IsWin(int row, int col)
{
    //水平方向是否赢棋
    for(int i=0;i<5;i++)
    {
        if(col-i>0&&
           col-i+4<BOARD_GRAD_SIZE&&
           gameMapVec[row][col-i]==gameMapVec[row][col-i+1]&&
           gameMapVec[row][col-i]==gameMapVec[row][col-i+2]&&
           gameMapVec[row][col-i]==gameMapVec[row][col-i+3]&&
           gameMapVec[row][col-i]==gameMapVec[row][col-i+4])
            return true;
    }

    //竖直方向是否赢棋
    for(int i=0;i<5;i++)
    {
        if(row-i>0&&
           row-i+4<BOARD_GRAD_SIZE&&
           gameMapVec[row-i][col]==gameMapVec[row-i+1][col]&&
           gameMapVec[row-i][col]==gameMapVec[row-i+2][col]&&
           gameMapVec[row-i][col]==gameMapVec[row-i+3][col]&&
           gameMapVec[row-i][col]==gameMapVec[row-i+4][col])
            return true;
    }

    //"/"方向
    for(int i=0;i<5;i++)
    {
        if(row+i-4>0&&
           row+i<BOARD_GRAD_SIZE&&
           col-i>0&&
           col-i+4<BOARD_GRAD_SIZE&&
           gameMapVec[row+i][col-i]==gameMapVec[row+i-1][col-i+1]&&
           gameMapVec[row+i][col-i]==gameMapVec[row+i-2][col-i+2]&&
           gameMapVec[row+i][col-i]==gameMapVec[row+i-3][col-i+3]&&
           gameMapVec[row+i][col-i]==gameMapVec[row+i-4][col-i+4])
            return true;
    }

    //"\"方向
    for(int i=0;i<5;i++)
    {
        if(row-i>0&&
           row-i+4<BOARD_GRAD_SIZE&&
           col-i>0&&
           col-i+4<BOARD_GRAD_SIZE&&
           gameMapVec[row-i][col-i]==gameMapVec[row-i+1][col-i+1]&&
           gameMapVec[row-i][col-i]==gameMapVec[row-i+2][col-i+2]&&
           gameMapVec[row-i][col-i]==gameMapVec[row-i+3][col-i+3]&&
           gameMapVec[row-i][col-i]==gameMapVec[row-i+4][col-i+4])
            return true;
    }

    return false;

}


//AI 落子
void Gamemodel::JiSuanScore()
{
    //统计玩家或电脑连成的子
    int P_Num=0;//玩家连成的子的个数
    int AI_Num=0;//AI连成子的个数
    int emptyNum=0;//各方向空白位的个数

    //清空评分数组
    scoreMapVec.clear();
    for(int i=0;i<BOARD_GRAD_SIZE;i++)
    {
        std::vector<int>lineScores;
        for(int j=0;j<BOARD_GRAD_SIZE;j++)
            lineScores.push_back(0);
        scoreMapVec.push_back(lineScores);
    }

    //计分（完全遍历）
    for(int row=0;row<BOARD_GRAD_SIZE;row++)
    {
        for(int col=0;col<BOARD_GRAD_SIZE;col++)
        {
            //空白点就算
            if(row>0&&col>0&&
                    gameMapVec[row][col]==0)
            {
                //遍历周围八个方向
                for(int y=-1;y<=1;y++)
                    for(int x=0;x<=1;x++)
                    {
                        //重置
                        P_Num=0;
                        AI_Num=0;
                        emptyNum=0;

                        //原坐标不算
                        if(!(y==0&&x==0))
                        {
                            //每个方向延伸4个子

                            //对玩家黑子评分（正反两个方向）
                            for(int i=1;i<=4;i++)
                            {
                                if(row + i * y>0 && row + i * y<BOARD_GRAD_SIZE&&
                                   col + i * x>0 && col + i * x<BOARD_GRAD_SIZE&&
                                   gameMapVec[row + i * y][col + i * x]==1)//真人玩家的子
                                {
                                    P_Num++;
                                }
                                else if(row + i * y>0 && row + i * y<BOARD_GRAD_SIZE&&
                                        col + i * x>0 && col + i * x<BOARD_GRAD_SIZE&&
                                        gameMapVec[row + i * y][col + i * x]==0)//空白位
                                {
                                    emptyNum++;
                                    break;
                                }
                                else
                                    break;
                            }

                            for(int i=1;i<=4;i++)
                            {
                                if(row - i * y > 0 && row - i * y<BOARD_GRAD_SIZE&&
                                   col - i * x > 0 && col- i * x <BOARD_GRAD_SIZE&&
                                        gameMapVec[row - i * y][col - i * x]==1)
                                {
                                    P_Num++;
                                }
                                else if(row - i * y > 0 && row - i * y <BOARD_GRAD_SIZE&&
                                        col- i * x > 0 && col - i * x <BOARD_GRAD_SIZE&&
                                        gameMapVec[row - i * y][col - i * x]==0)//空白位
                                {
                                    emptyNum++;
                                    break;
                                }
                                else
                                    break;
                            }

                            if(P_Num==1)
                                scoreMapVec[row][col]+=10;
                            else if(P_Num == 2)
                            {
                                if(emptyNum==1)
                                    scoreMapVec[row][col]+=30;
                                else if(emptyNum==2)
                                    scoreMapVec[row][col]+=40;
                            }
                            else if(P_Num==3)
                            {
                                if(emptyNum==1)
                                    scoreMapVec[row][col]+=60;
                                else if(emptyNum==2)
                                    scoreMapVec[row][col]+=110;
                            }
                            else if(P_Num==4)
                                scoreMapVec[row][col]+=10100;

                            //进行一次清空
                            emptyNum=0;

                            //对AI白子评分
                            //正方向
                            for(int i=1;i<=4;i++)
                            {
                                if(row + i * y>0 && row + i * y < BOARD_GRAD_SIZE&&
                                   col + i * x>0 && col + i * x < BOARD_GRAD_SIZE&&
                                   gameMapVec[row + i * y][col + i * x]==-1)//玩家的子
                                {
                                    AI_Num++;
                                }
                                else if(row + i * y>0 && row + i * y < BOARD_GRAD_SIZE&&
                                        col + i * x>0 && col+ i * x <BOARD_GRAD_SIZE&&
                                        gameMapVec[row+i * y][col+i * x]==0)//空白位
                                {
                                    emptyNum++;
                                    break;
                                }
                                else
                                    break;
                            }

                            //反方向
                             for(int i=1;i<=4;i++)
                             {
                                 if(row-i * y>0 && row-i * y < BOARD_GRAD_SIZE&&
                                    col-i * x>0 && col- i * x <BOARD_GRAD_SIZE&&
                                    gameMapVec[row-i * y][col-i * x]==-1)//玩家的子
                                 {
                                     AI_Num++;
                                 }
                                 else if(row-i*y>0 && row-i*y < BOARD_GRAD_SIZE&&
                                         col-i*x>0 && col- i*x <BOARD_GRAD_SIZE&&
                                         gameMapVec[row-i*y][col-i*x]==0)//空白位
                                 {
                                     emptyNum++;
                                     break;
                                 }
                                 else
                                     break;
                             }
                             if(AI_Num==0)
                                 scoreMapVec[row][col]+=5;
                             else if(AI_Num==1)
                                 scoreMapVec[row][col]+=10;
                             else if(AI_Num==2)
                             {
                                 if(emptyNum==1)
                                     scoreMapVec[row][col]+=25;
                                 else if(emptyNum==2)
                                     scoreMapVec[row][col]+=50;
                             }
                             else if(AI_Num==2)
                             {
                                 if(emptyNum==1)
                                     scoreMapVec[row][col]+=25;
                                 else if(emptyNum==2)
                                     scoreMapVec[row][col]+=50;
                             }
                             else if(AI_Num==3)
                             {
                                 if(emptyNum==1)                   //死四
                                     scoreMapVec[row][col]+=55;
                                 else if(emptyNum==2)              //活四
                                     scoreMapVec[row][col]+=100;
                             }
                             else if(AI_Num==4)
                                 scoreMapVec[row][col]+=20000;     //活五，拥有最高优先级
                        }
                    }
            }
        }
    }
}

//AI 落子
void Gamemodel::byAI(int &clickRow, int &clickCol)
{
    //计算评分
    JiSuanScore();

    //从评分中找出最大分数的位置
    int maxScore=0;
    std::vector<std::pair<int,int>>maxPoints;

    for(int row=1;row<BOARD_GRAD_SIZE;row++)
        for(int col=1;col<BOARD_GRAD_SIZE;col++)
        {
            //前提是这个坐标是空的
            if(gameMapVec[row][col]==0)
            {
                if(scoreMapVec[row][col]>maxScore)
                {
                    maxPoints.clear();
                    maxScore=scoreMapVec[row][col];
                    maxPoints.push_back(std::make_pair(row,col));
                }
                else if(scoreMapVec[row][col]==maxScore)
                    maxPoints.push_back((std::make_pair(row,col)));
            }
         }

    //随机落子，如果有多个点的话
    srand((unsigned)time(0));
    int index=rand()%maxPoints.size();

    std::pair<int,int>pointPair=maxPoints.at(index);
    clickRow=pointPair.first;//记录落子点
    clickCol=pointPair.second;
    updateGameMap(clickRow,clickCol);
}
